import * as fs from 'fs';
import * as path from 'path';
import * as mime from 'mime-types';

/**
 * 文件工具类，提供文件和路径处理相关方法
 */
export class FileUtils {
  /**
   * 检查路径是否存在
   */
  public static exists(filePath: string): boolean {
    try {
      return fs.existsSync(filePath);
    } catch (error) {
      return false;
    }
  }

  /**
   * 检查路径是否为目录
   */
  public static isDirectory(filePath: string): boolean {
    try {
      return fs.statSync(filePath).isDirectory();
    } catch (error) {
      return false;
    }
  }

  /**
   * 检查路径是否为文件
   */
  public static isFile(filePath: string): boolean {
    try {
      return fs.statSync(filePath).isFile();
    } catch (error) {
      return false;
    }
  }

  /**
   * 获取文件的MIME类型
   */
  public static getMimeType(filePath: string): string {
    return mime.lookup(filePath) || 'application/octet-stream';
  }

  /**
   * 获取文件大小（字节）
   */
  public static getFileSize(filePath: string): number {
    try {
      return fs.statSync(filePath).size;
    } catch (error) {
      return 0;
    }
  }

  /**
   * 读取目录内容
   */
  public static readDirectory(dirPath: string): string[] {
    try {
      return fs.readdirSync(dirPath);
    } catch (error) {
      return [];
    }
  }

  /**
   * 获取文件流
   */
  public static createReadStream(filePath: string): fs.ReadStream {
    return fs.createReadStream(filePath);
  }

  /**
   * 获取格式化的文件大小
   */
  public static formatFileSize(bytes: number): string {
    if (bytes === 0) return '0 B';
    const units = ['B', 'KB', 'MB', 'GB', 'TB'];
    const i = Math.floor(Math.log(bytes) / Math.log(1024));
    return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + ' ' + units[i];
  }

  /**
   * 规范化路径，移除路径遍历
   */
  public static normalizePath(rootDir: string, subPath: string): string {
    // 防止路径遍历攻击
    const normalizedPath = path.normalize(subPath).replace(/^(\.\.[\/\\])+/, '');
    return path.join(rootDir, normalizedPath);
  }

  /**
   * 获取文件的最后修改时间
   */
  public static getLastModified(filePath: string): Date {
    try {
      return fs.statSync(filePath).mtime;
    } catch (error) {
      return new Date();
    }
  }

  /**
   * 获取文件类型对应的图标
   */
  public static getFileIcon(fileName: string, isDirectory: boolean): string {
    if (isDirectory) return '📁 ';

    const extension = path.extname(fileName).toLowerCase();

    // 根据文件扩展名返回不同的图标
    switch (extension) {
      case '.js':
      case '.ts':
      case '.jsx':
      case '.tsx':
        return '📜 ';
      case '.html':
      case '.htm':
        return '🌐 ';
      case '.css':
      case '.scss':
      case '.sass':
      case '.less':
        return '🎨 ';
      case '.json':
        return '📊 ';
      case '.md':
        return '📝 ';
      case '.jpg':
      case '.jpeg':
      case '.png':
      case '.gif':
      case '.svg':
      case '.ico':
        return '🖼️ ';
      case '.pdf':
        return '📑 ';
      case '.zip':
      case '.rar':
      case '.7z':
      case '.tar':
      case '.gz':
        return '📦 ';
      case '.mp3':
      case '.wav':
      case '.ogg':
        return '🎵 ';
      case '.mp4':
      case '.avi':
      case '.mov':
      case '.webm':
        return '🎬 ';
      case '.xlsx':
      case '.xls':
      case '.csv':
        return '📊 ';
      case '.doc':
      case '.docx':
        return '📄 ';
      case '.ppt':
      case '.pptx':
        return '📽️ ';
      default:
        return '📄 ';
    }
  }
}
